home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
FROMUTS
/
UNIXLIB37B
/
src
/
unix
/
c
/
getwd
< prev
next >
Wrap
Text File
|
1992-03-09
|
1KB
|
53 lines
static char sccs_id[] = "@(#) getcwd.c 3.0 "__DATE__" HJR";
/* getcwd.c (c) Copyright 1990 H.Rogers */
/* thanks to Andy (torq@gnu.ai.mit.edu) for the OS calls */
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include "sys/unix.h"
#include "sys/os.h"
#include "sys/param.h"
char *getwd(char *v,int l)
{
char b[MAXPATHLEN];
register char *s,*t;
register int i;
int r[10];
os_error *e;
s = v + l - 1;
*s = 0; for (;;)
{
r[0] = 6; r[2] = (int)b; if (e = os_swi(0x0c,r))
{ __seterr(e); err: if (*s == '/') chdir(++s); return(0); }
if (b[2] == '$' && b[1] == 1) break;
if ((t = s - b[1]) <= v) { errno = ENOMEM; goto err; } s = t;
memcpy(s,b + 2,b[1]);
*--s = '/';
chdir("..");
}
chdir(s+1);
if (s <= v + 2) { errno = ENOMEM; return(0); }
*--s = '$'; *--s = '.';
r[0] = 5; r[2] = (int)b; if (e = os_swi(0x0c,r))
{ __seterr(e); return(0); }
if ((t = s - b[0]) <= v + 2) { errno = ENOMEM; return(0); } s = t;
memcpy(s,b + 1,b[0]);
*--s = ':'; *--s = ':';
if (e = os_args(0,0,0,r)) { __seterr(e); return(0); }
r[1] = r[0]; r[0] = 33; r[2] = (int)b; r[3] = MAXPATHLEN;
if (e = os_swi(0x29,r)) { __seterr(e); return(0); }
t = b; for (i = 0; i++,*t++; ); i--;
if ((t = s - i) <= v) { errno = ENOMEM; return(0); } s = t;
memcpy(s,b,i);
*--s = '/';
memcpy(v,s,v + l - s);
return(v);
}